Database Tutorials Concurrency এবং Locking Mechanisms গাইড ও নোট

299

Concurrency এবং Locking Mechanisms PostgreSQL বা অন্য কোনও ডেটাবেস সিস্টেমের মধ্যে ডেটার সঠিকতা এবং একাধিক ইউজারের মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণের জন্য অত্যন্ত গুরুত্বপূর্ণ। এই দুটি ধারণা একে অপরের সাথে সম্পর্কিত এবং ডেটাবেসে একাধিক ট্রানজেকশন চলতে থাকা অবস্থায় সঠিকভাবে ডেটা পরিচালনা করা নিশ্চিত করে।


1. Concurrency in PostgreSQL

Concurrency হল একাধিক ট্রানজেকশন একই সময়ে ডেটাবেসে প্রবেশ এবং ডেটা নিয়ে কাজ করার প্রক্রিয়া। PostgreSQL এর MVCC (Multi-Version Concurrency Control) প্রযুক্তি ব্যবহার করে, যেখানে একাধিক ট্রানজেকশন একই ডেটা পণ্যে কাজ করতে পারে কিন্তু একে অপরের প্রভাব থেকে বিচ্ছিন্ন থাকে।

MVCC এর কাজ করার পদ্ধতি:

  • যখন কোনো ট্রানজেকশন ডেটার কোনও অংশে পরিবর্তন করে, তখন PostgreSQL পুরনো ডেটার একটি কপি সংরক্ষণ করে এবং নতুন সংস্করণ তৈরি করে।
  • একাধিক ট্রানজেকশন যখন একই রেকর্ডে কাজ করে, তখন PostgreSQL তাদের মধ্যে পার্থক্য রেখে ডেটা পেশ করে এবং প্রতিটি ট্রানজেকশনকে আলাদা ভার্সনে সংরক্ষণ করে, যার ফলে তারা একে অপরকে প্রভাবিত করে না।
  • MVCC ট্রানজেকশনগুলোকে Isolation মানের মধ্যে রেখে একে অপরের প্রভাব থেকে রক্ষা করে।

Concurrency এর উদাহরণ:

ধরা যাক, দুটি ট্রানজেকশন একই সময়ে একটি টেবিলের রেকর্ড আপডেট করছে। PostgreSQL তাদের আলাদা আলাদা ভার্সন তৈরি করবে এবং একে অপরের কাজের ওপর প্রভাব ফেলবে না, যতক্ষণ না একটি ট্রানজেকশন সম্পন্ন না হয়।


2. Locking Mechanisms in PostgreSQL

Locking হলো একাধিক ট্রানজেকশনের মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণের প্রক্রিয়া। PostgreSQL বিভিন্ন ধরণের লক ব্যবহার করে, যাতে একাধিক ট্রানজেকশন একে অপরের প্রভাব থেকে মুক্ত থাকে এবং ডেটাবেসের একাধিক অংশে কাজ করার সময় সঠিকতা বজায় থাকে।

PostgreSQL এ লকিং এর ধরন:

  1. Row-Level Locking (লাইনের স্তরে লক):

    • যখন কোনো ট্রানজেকশন একাধিক রেকর্ড আপডেট বা ডিলিট করতে চায়, তখন Row-Level Locking ব্যবহার করা হয়।
    • এই লকটি নির্দিষ্ট একটি রেকর্ড বা রো-এ একমাত্র ট্রানজেকশনকে পরিবর্তন করতে দেয়। অন্য ট্রানজেকশন তখন সেই রেকর্ডে অ্যাক্সেস করতে পারবে না যতক্ষণ না প্রথম ট্রানজেকশন শেষ হয়।
    • FOR UPDATE কুয়েরি ব্যবহার করলে PostgreSQL ওই রোটি লক করে রাখে।

    উদাহরণ:

    BEGIN;
    SELECT * FROM users WHERE id = 1 FOR UPDATE;
    UPDATE users SET status = 'active' WHERE id = 1;
    COMMIT;
    
  2. Table-Level Locking (টেবিল স্তরের লক):

    • যখন পুরো টেবিলের ওপর লক প্রয়োজন, তখন Table-Level Locking ব্যবহার করা হয়। এটি সম্পূর্ণ টেবিলের উপর অ্যাক্সেস নিষিদ্ধ করে রাখে যাতে কোনও ট্রানজেকশন অন্য ট্রানজেকশনের কাজ সম্পন্ন না হওয়া পর্যন্ত অ্যাক্সেস না পায়।
    • এটি সাধারণত LOCK TABLE কুয়েরি ব্যবহার করে করা হয়।

    উদাহরণ:

    BEGIN;
    LOCK TABLE users IN EXCLUSIVE MODE;
    UPDATE users SET status = 'active' WHERE id = 1;
    COMMIT;
    
  3. Shared Lock:

    • Shared Lock (যেমন FOR SHARE) অন্য ট্রানজেকশনের জন্য রো পড়া বা নির্বাচনের অনুমতি দেয়, তবে লেখার জন্য অনুমতি দেয় না। একাধিক ট্রানজেকশন একই রোতে Shared Lock রাখতে পারে, তবে রোতে কোনো আপডেট বা ডিলিট করা যাবে না।

    উদাহরণ:

    BEGIN;
    SELECT * FROM users WHERE city = 'Dhaka' FOR SHARE;
    COMMIT;
    
  4. Exclusive Lock:
    • Exclusive Lock একমাত্র একটি ট্রানজেকশনকে নির্দিষ্ট রেকর্ডে সম্পূর্ণ নিয়ন্ত্রণ দেয়, অন্য কোনো ট্রানজেকশন তখন এই রেকর্ডে কোনো পরিবর্তন করতে পারবে না।
    • এটি সাধারণত FOR UPDATE কুয়েরি দিয়ে ব্যবহৃত হয়।
  5. Advisory Locks:

    • PostgreSQL Advisory Locks প্রদান করে, যা ডেটাবেস লেভেলে সিস্টেমের কাস্টম লকিং ব্যবস্থা তৈরি করতে সহায়তা করে। এটি সাধারণত অ্যাপ্লিকেশন লেভেলে ব্যবহৃত হয় এবং অটোমেটিক নয়।

    উদাহরণ:

    SELECT pg_advisory_lock(12345);  -- Lock using custom lock id
    -- Do some work
    SELECT pg_advisory_unlock(12345); -- Unlock after work is done
    

3. Types of Locks in PostgreSQL

PostgreSQL এ কিছু সাধারণ লক ধরন রয়েছে, যেমন:

  • Access Share Lock: SELECT কুয়েরি যখন এক্সিকিউট করা হয়।
  • Row Share Lock: এটি অন্যান্য ট্রানজেকশনের জন্য রো-তে পঠন ও লেখা নিষিদ্ধ করে।
  • Exclusive Lock: শুধুমাত্র একটি ট্রানজেকশনের জন্য রো বা টেবিল সম্পূর্ণ নিয়ন্ত্রণ রাখে।
  • Access Exclusive Lock: এটি টেবিল লক করে, অন্য কোনো ট্রানজেকশনকে অ্যাক্সেসের অনুমতি দেয় না।

4. Deadlock and Deadlock Detection

Deadlock একটি পরিস্থিতি যেখানে একাধিক ট্রানজেকশন একে অপরের জন্য অপেক্ষা করছে, এবং তাদের মধ্যে কোনো প্রগ্রেস হচ্ছে না। PostgreSQL এই ডেডলক সিচুয়েশনগুলি শনাক্ত করতে এবং সমাধান করতে সক্ষম।

PostgreSQL ডেডলক সিচুয়েশন সনাক্ত করার জন্য নিম্নলিখিত পদ্ধতি ব্যবহার করে:

  • Timeout: যদি একটি ট্রানজেকশন ডেডলকে আটকে থাকে, PostgreSQL এটি একটি নির্দিষ্ট সময় পর নিষ্ক্রিয় করে দেয়।
  • Automated Deadlock Detection: PostgreSQL ডেডলক সিচুয়েশন স্বয়ংক্রিয়ভাবে সনাক্ত করে এবং এক বা একাধিক ট্রানজেকশনকে বাতিল করে দেয়।

5. Isolation Levels and Their Impact on Locking

PostgreSQL বিভিন্ন Isolation Levels সাপোর্ট করে, যা ট্রানজেকশনগুলির মধ্যে ইন্টারঅ্যাকশন নির্ধারণ করে এবং ডেটাবেসে লকিং-এর আচরণ প্রভাবিত করে।

  1. Read Uncommitted: এই স্তরে একটি ট্রানজেকশন অপর ট্রানজেকশনের অকমিটেড পরিবর্তন দেখতে পারে। এটি PostgreSQL এ সমর্থিত না।
  2. Read Committed: এটি ডিফল্ট আইসোলেশন লেভেল, যেখানে ট্রানজেকশন শুধুমাত্র কমিটেড ডেটা দেখতে পায়।
  3. Repeatable Read: এই লেভেলে, ট্রানজেকশন একটি নির্দিষ্ট ডেটা সেটের সাথে কাজ করে এবং পরবর্তী সময়ে সেই ডেটাতে পরিবর্তন হলে তা দেখতে পায় না।
  4. Serializable: এটি সর্বোচ্চ আইসোলেশন লেভেল, যেখানে কোনো ট্রানজেকশন অন্য ট্রানজেকশন দ্বারা প্রভাবিত হতে পারে না। এটি অধিক লকিং সৃষ্টি করতে পারে, তবে ডেটার সঠিকতা নিশ্চিত হয়।

সারাংশ

  • Concurrency PostgreSQL-এ একাধিক ট্রানজেকশনকে সমান্তরালভাবে চলতে সাহায্য করে, যেখানে MVCC প্রযুক্তি সঠিকভাবে ট্রানজেকশনগুলির প্রভাব সীমাবদ্ধ রাখে।
  • Locking Mechanisms ডেটাবেসের মধ্যে একাধিক ট্রানজেকশনের মধ্যে অ্যাক্সেস কন্ট্রোল বজায় রাখে এবং সঠিক ডেটার অ্যাক্সেস নিশ্চিত করে।
  • Deadlock শনাক্তকরণ এবং Isolation Levels এর মাধ্যমে ট্রানজেকশন পরিচালনা করা হয়, যাতে সঠিকতা এবং কার্যকারিতা বজায় থাকে।
Content added By
Promotion

Are you sure to start over?

Loading...